package com.gem.day11;

import static com.gem.day11.PersonComparatroFactory.*;

import java.util.List;

import com.google.common.collect.Lists;

/**
 * 本类用来演示Java集合排序
 * 
 * 排序方式
 * 1.使用Comparator接口,重写compare(o1,o2)			灵活多变(匿名,工厂),推荐使用 
 * 2.实体类实现Comparable接口,重写compareTo(o)	不灵活,只能定义一个排序规则,不推荐使用
 * 
 * @author easonsy
 * 2020年7月31日 上午9:46:39
 */
public class ListSortDemo {
	public static void main(String[] args) {
		Person p1 = new Person("Yam", 26, "美国", 'M');
		Person p2 = new Person("Rose", 22, "美国", 'F');
		Person p3 = new Person("Tom", 21, "美国", 'M');
		Person p4 = new Person("LiLei", 26, "中国", 'M');
		Person p5 = new Person("HanMeimei", 29, "中国", 'F');
		//使用guava
		List<Person> persons = Lists.newArrayList(p1, p2, p3, p4, p5);

		//创建比较器对象,需要手动实现比较器接口,重写compare()方法
		//Comparator<Person> comparator = new PersonAgeComparator();

		//匿名内部类
		/*persons.sort(new Comparator<Person>() {
			@Override
			public int compare(Person p1, Person p2) {
				if (p1.getAge() > p2.getAge()) {
					return 1;
				} else if (p1.getAge() < p2.getAge()) {
					return -1;
				}
				return 0;
			}
		});*/

		//JDK8.0 匿名内部类写法,搭配lambda表达式
		//注意: 如果排序规则较多,可以提供比较器工厂
		/*persons.sort((o1, o2) -> {
			if (o1.getAge() > o2.getAge()) {
				return 1;
			} else if (o1.getAge() < o2.getAge()) {
				return -1;
			} else {
				//双重排序规则
				return o1.getName().compareTo(o2.getName());
			}
		});*/

		persons.sort(getComparator(NAME_MIN_TO_MAX));

		persons.forEach(System.out::println);
	}
}
